import { dictDataInfo } from '#/api/system/dict/dict-data';
import { useDictStore } from '#/store/dict';
import { getLocale } from '#/utils/lang';

/**
 * 抽取公共逻辑的基础方法
 * @param dictName 字典名称
 * @param dataGetter 获取字典数据的函数
 * @param formatNumber 是否格式化字典value为number类型
 * @returns 数据
 */
function fetchAndCacheDictData<T>(
  dictName: string,
  dataGetter: () => T[],
  formatNumber = false,
): T[] {
  const { dictRequestCache, setDictInfo } = useDictStore();
  // 有调用方决定如何获取数据
  const dataList = dataGetter();

  // 检查请求状态缓存
  if (dataList.length === 0 && !dictRequestCache.has(dictName)) {
    dictRequestCache.set(dictName, true);
    dictDataInfo(dictName)
      .then((resp) => {
        // 内部处理了push的逻辑 这里不用push
        setDictInfo(dictName, resp, formatNumber);
      })
      .finally(() => {
        dictRequestCache.delete(dictName);
      });
  }
  return dataList;
}

/**
 * 这里是提供给渲染标签使用的方法
 * @deprecated 使用getDictOptions代替 于下个版本删除
 * @param dictName 字典名称
 * @returns 字典信息
 */
// export function getDict(dictName: string) {
//   const { getDictOptions } = useDictStore();
//   return fetchAndCacheDictData(dictName, () => getDictOptions(dictName));
// }

/**
 * 一般是Select, Radio, Checkbox等组件使用
 * @param dictType 字典名称
 * @param formatNumber 是否格式化字典value为number类型
 * @returns Options数组
 */
export function getDictOptions(dictType: string, formatNumber = false) {
  const { getDictOptions } = useDictStore();
  return fetchAndCacheDictData(
    dictType,
    () => getDictOptions(dictType),
    formatNumber,
  );
}

export function getDictValue(dictType: string, key: number | string) {
  const dictList = getDictOptions(dictType);
  const dict = dictList.find((item) => item.value === key);
  return getLocale(dict?.label);
}
